package com.sti.platform.service.impl;

import com.aisino.core.server.BaseService;
import com.aisino.tools.enums.PageEnum;
import com.aisino.tools.enums.QlEnum;
import com.aisino.tools.util.page.Page;
import com.aisino.tools.util.page.Pagination;
import com.sti.platform.dao.SysLogDao;
import com.sti.platform.model.SysLog;
import com.sti.platform.model.User;
import com.sti.platform.service.SysLogService;
import com.sti.platform.util.UtilDate;
import com.sti.platform.util.UtilReflex;
import com.sti.platform.util.excel.UtilExcel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 系统日志类 Service 实现层
 * @author zyy
 * @time 2018年5月28日 11:51:35
 */
@Service
public class SysLogServiceImpl extends BaseService implements SysLogService {

	@Autowired
	private SysLogDao sysLogDao;

	@Override
	public List<SysLog> getAllSysLog() {
		return sysLogDao.getAllSysLog();
	}

	@Override
	public List<SysLog> getSysLogByParam( String params[],Object values[]) {
		String sql  = "SELECT * FROM sys_log WHERE 1=1 ";
		return sysLogDao.getSysLogByParam(sql, params, values);
	}

	@Override
	public SysLog getSysLogByID(String id) {
		return sysLogDao.getSysLogByID(id);
	}


	@Override
	public List<SysLog> getSysLogByPage(SysLog sysLog, String page, String row) {


		//反射获取参数
		Map map = UtilReflex.reflexModel(sysLog);// params --> values 一定是一对一有值的
		String params[] = (String[])map.get("params");//参数 数组
		Object values[] = (Object[])map.get("values");//参数值  数组
		String sql  = " ";
		StringBuffer sb = new  StringBuffer();
		sb.append("SELECT * FROM sys_log WHERE 1=1 ");//基础查询
		if(params!=null && params.length>0){//有参数，这里只做 标题查询
			for(int i=0;i<params.length;i++){
				String para = params[i];
				if(para.equals("enddate")){//按 结束时间 查询 Arrays.asList(params).contains("enddate") listParams.contains("enddate")
					//结束时间 包括结束当天的
					sb.append(" AND createtime >=:enddate ");
				}else if(para.equals("startdate")){//开始时间
					if(values[i].toString().length()<11){
						values[i] = values[i]+" 23:59:59";
					}
					sb.append(" AND createtime <=:startdate ");
				}else{//其他，均为模糊查询
					values[i] = "%"+values[i]+"%";
					sb.append(" AND "+para+" LIKE:"+para+" ");
				}
			}
		}

		sb.append(" ORDER BY createtime DESC ");//按照时间降序
		sql = sb.toString();
		Page pageModel = new Pagination();
		Integer nowPage = changStingNum(page,1);//当前页
		Integer nowRow =  changStingNum(row,10);//当前页最大数据量
		Integer total = sysLogDao.getAllSysLogNum();
		Integer totalPage =  (total%nowRow==0) ? (total/nowRow) :  ((total/nowRow) +1);//总页数
		nowPage = (nowPage >=totalPage) ? totalPage : nowPage ;//当前页，判读
		pageModel.setPage(nowPage);//当前页数
		pageModel.setRow(nowRow);//每页多少条

		pageModel.setTotal(total);
		//1000代表取  PageEnum.PAGE_TOP的时候 的top数量
		return sysLogDao.getSysLogByPage(sql, params, values, 1000, pageModel, QlEnum.SQL, PageEnum.PAGE_YES);
	}

	/**
	 * 使用工具，根据传递的 object 判断是不是数字，是数字转换成数字，不
	 * 是数字，返回自己指定的数字，不指定默认为1
	 * @param returnNum
	 * @return
	 */


	public Integer changStingNum(String numStr,Integer returnNum){
		if(returnNum==null){
			returnNum = 1;
		}
		if(numStr!=null && !"".equals(numStr) && numStr.matches("^\\d+$")){//是数字
			returnNum = Integer.valueOf(numStr);
		}
		return returnNum;
	}

	@Override
	public void saveSysLog(SysLog sysLog) {
		//从 session 中获取 用户的信息
		User user = new User();
		user.setId("adminid123456");
		user.setRealName("管理员");
		// RandomUtils.randomUUID() ;
		//uuid
		sysLog.setOptuserid(user.getId());
		//创建人
		sysLog.setOptusername(user.getRealName());
		//创建时间
		sysLog.setCreatetime(UtilDate.dateToStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
		//断言的形式进行，校验
		//Assert.isTrue(StringUtils.hasText(SysLog.getTitle()), "标题不能为空.");
		super.save(sysLog);
	}

	@Override
	public void delSysLog(String id) {
		String[] ids = id.split(",");
		if(ids.length>1){//多条删除
			sysLogDao.delSysLog(ids);
		}else{
			sysLogDao.delSysLog(id);
		}
	}

	@Override
	public void delSysLog(String ids[]) {
		sysLogDao.delSysLog(ids);
	}

	@Override
	public void updateSysLog(SysLog sysLog) {
		//从 session 中获取 用户的信息
		User user = new User();
		user.setId("updateadminid123456");
		user.setRealName("Update管理员");
		// RandomUtils.randomUUID() ;
		//uuid

		//断言的形式进行，校验
		//Assert.isTrue(StringUtils.hasText(SysLog.getTitle()), "标题不能为空.");
		super.update(sysLog);

	}


	/**
	 * Excel导出单表数据
	 * @param response
	 */
	@Override
	public void eportSysLog( HttpServletResponse response){
		UtilExcel<SysLog> ue = new UtilExcel(SysLog.class);
		List<SysLog> list = new ArrayList<SysLog>();
		String sql = " select * from sys_log where 1=1 ";
		list = sysLogDao.getSysLogByParam(sql,null,null);
		try{
			if(list.isEmpty()){//空
				SysLog bean = new SysLog();
				bean.setContent("暂无数据");
				list.add(bean);
			}
			ue.getListToExcel(list,"日志信息","日志信息",response);
		}catch (Exception e){
			e.printStackTrace();
		}

	}

	/**
	 * Excel导入单表数据
	 * @param file
	 */
	@Override
	public void importSysLog( MultipartFile file){
		try{
			//转换成输入流
			InputStream is = file.getInputStream();

			UtilExcel<SysLog> ue = new UtilExcel(SysLog.class);
			List<SysLog> list = new ArrayList<SysLog>();
			list = ue.getExcelToList(file);
			System.out.println(list);
		}catch (Exception e){
			e.printStackTrace();
		}

	}

}
